/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canJump = function (nums) {
    // end：当前跳的右边界  jumps：最小跳数，max：当前跳数区域中能到达的最远的地方
    let end = 0, end1 = -1, max = 0, len = nums.length;
    for (let i = 0; i < len; i++) {
        // 两次跳跃的边界相同，则不可能到达终点
        if(end === end1) {
            return false
        }
        // 右边界大于等于len-1就返回
        if (end >= len - 1) {
            return true
        }
        // 更新当前跳数最远距离
        if (nums[i] + i > max) max = nums[i] + i;
        // 指针走到右边界，更新
        if (i === end) {
            end1 = end
            end = max
            max = 0
        }
    }
};
console.log(canJump([2,3,1,1,4]));
console.log(canJump([3,2,1,0,4]));